package com.yy.poly_.detail_;


/**
 * chapter08  com.yy.poly_.detail_
 * 2023-04-06 22:04
 *
 * @author yy yuyue
 * description : 不可描述
 * @date 2023/4/6 22:04
 */
public class PolyDetail {
    public static void main(String[] args) {

        //向上转型: 父类的引用指向了子类的对象
        //语法: 父类类型引用名: = new 子类类型();

        Animal animal = new Cat();
        Animal animal1 = new Dog();

        Object obj = new Cat();//可以吗?  可以 Object 也是 Cat的父类
        System.out.println("ojbk");


        //向上转型调用方法的规则如下:
        /*可以调用父类中的所有成员(需要遵守访问权限)
        但是不能调用子类的特有的成员
        因为在编译阶段, 能调用哪些成员,是由编译类型来决定的
        */
       // animal.catMouse();//error  错误
        /*

        最终运行效果看子类(运行类型)的具体实现 调用方法 按照从子类(运行类型）快速查找方法
        然后调用 规则我前面我们讲的方法调用规则一致
         */
        animal.eat();//吃
        animal.run();//跑
        animal.show();//hello,你好
        animal.sleep();//睡


        //老师希望, 可以调用Cat的  catMouse方法
        //多态的向下转型
        //(1)语法: 子类类型 引用名 = (子类类型)父类引用;
        //问一个问题? cat的 编译类型是 Cat, 运行类型是 Cat
        Cat cat = (Cat)animal;
        cat.catMouse();//猫抓老鼠
        //(2) 要求父类的引用必须指向的是当前目标类型的对象
      // Dog dog = (Dog)animal; //可以吗?  err
    //  Dog dog = (Dog)animal1; //可以吗?  ok
    }
}
